package ucla.encuestaMatic.vista.ventanas;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;

import ucla.encuestaMatic.controlador.interfaces.IServicioAdministracionDefinicionEncuesta;
import ucla.encuestaMatic.modelo.beans.Numeros;
import ucla.encuestaMatic.modelo.beans.RespuestaCerrada;
import ucla.encuestaMatic.modelo.beans.TipoRespuesta;
import ucla.encuestaMatic.modelo.data.Encuesta;
import ucla.encuestaMatic.modelo.data.OpcionPregunta;
import ucla.encuestaMatic.modelo.data.Pregunta;
import ucla.encuestaMatic.modelo.data.pk.EncuestaPersonaId;

import nextapp.echo2.app.Column;
import nextapp.echo2.app.Component;
import nextapp.echo2.app.ContentPane;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.extras.app.layout.TabPaneLayoutData;

import com.obelisco.exception.ObeliscoException;
import com.obelisco.vista.componentes.ComponenteDatosListener;
import com.obelisco.vista.componentes.ListaBase;
import com.obelisco.vista.componentes.TipoFuncion;
import com.obelisco.vista.controles.BindingDateField;
import com.obelisco.vista.controles.BindingNumericTextField;
import com.obelisco.vista.controles.BindingTextArea;
import com.obelisco.vista.controles.BindingTextField;
import com.obelisco.vista.controles.BotonFuncion;
import com.obelisco.vista.controles.Grid;
import com.obelisco.vista.controles.Label;
import com.obelisco.vista.controles.SelectField;
import com.obelisco.vista.plantillas.VentanaBase;

public class PanePreguntaDefinicionEncuesta extends ContentPane implements ComponenteDatosListener {

	private Pregunta pregunta;
	private Encuesta encuesta;
	private IServicioAdministracionDefinicionEncuesta servicioAdministracionDefinicionEncuesta;
	
	// Primer Tab
	private SelectField cmbNumero;
	private BindingTextField txtEnunciado;
	private BindingTextArea txtDescripcion;
	private SelectField cmbRespuestaObligatoria;
	private SelectField cmbTipoRespuesta;
	private BindingNumericTextField txtValorMinimoRespuesta;
	private BindingNumericTextField txtValorMaximoRespuesta;
	// Segundo Tab
	private ListaBase lstOpcionesRespuesta;
	
	
	public void onCancelar() {
		// TODO Auto-generated method stub
		
	}

	public void onConfirmarCambios(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub
		this.pregunta.setEncuesta(this.encuesta);
		this.pregunta.setNumero((Integer)((Numeros)this.cmbNumero.getSelectedItem()).getId());
		if (this.cmbRespuestaObligatoria.getSelectedItem() != null) {
			this.pregunta.setRespuestaObligatoria(((RespuestaCerrada)this.cmbRespuestaObligatoria.getSelectedItem()).getId().toString());
		}
		if (this.cmbTipoRespuesta.getSelectedItem() != null) {
			this.pregunta.setTipoRespuesta(((TipoRespuesta)this.cmbTipoRespuesta.getSelectedItem()).getId().toString());
		}
		this.encuesta.getPreguntas().add(this.pregunta);
		this.servicioAdministracionDefinicionEncuesta.validarPregunta(this.pregunta);
	}

	public void onConfirmarEliminacion(Object object) {
		// TODO Auto-generated method stub
		
	}

	public void onConsultar(Object objeto) {
		// TODO Auto-generated method stub
		this.onModificar(objeto);
		this.setEnabled(false);
	}

	public void onCrear() {
		// TODO Auto-generated method stub
		
	}

	public void onFuncionPersonalizada(Object objeto, TipoFuncion funcion, String nombre) {
		// TODO Auto-generated method stub
		
	}

	private boolean incluir = false;
	public void onIncluir(Object objeto) {
		// TODO Auto-generated method stub
		this.incluir = true;
		this.setEnabledPorPestana(false, 1);
		this.cmbNumero.setSelectedItemPorId(new Integer(this.encuesta.getPreguntas().size()+1));
	}

	private void setEnabledPorPestana(boolean valor, int numeroPestana) {
		Component component = ((VentanaBase)this.ventanaPadre).getAreaTrabajo().getComponent(numeroPestana);
		// Chequeamos que el componente es la ListaBase 
		if (component instanceof ListaBase) {
			// Revisamos los botones de funciones 
			for (Iterator iter=((ListaBase)component).getBarraHerramientas().getFunciones().iterator(); iter.hasNext(); ) {
				BotonFuncion botonFuncion = (BotonFuncion)iter.next();
				botonFuncion.setEnabled(valor);
				// Si es el boton de Consultar siempre lo dejamos habilitado
				if ((botonFuncion.getTipoFuncion() == TipoFuncion.BUSCAR) &&
					(!this.incluir)) {					
					botonFuncion.setEnabled(true);
				}
				this.incluir = false;
			}
		}			
		else {
			component.setEnabled(valor);
		}
	}
	
	public void setEnabled(boolean valor) {
		for (int i=0; i<((VentanaBase)this.ventanaPadre).getAreaTrabajo().getComponentCount(); i++) {
			this.setEnabledPorPestana(valor, i);
		}
	}
	
	private ListaBase configurarSegundoTab() {
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle("Opciones de Respuesta");
		this.lstOpcionesRespuesta.setLayoutData(columnLayoutData);		
		return this.lstOpcionesRespuesta;
	}
	
	private void configurarPorTipoDeRespuesta() {
		this.txtValorMinimoRespuesta.setText("0");
		this.txtValorMaximoRespuesta.setText("0");
		this.txtValorMinimoRespuesta.setEnabled(false);
		this.txtValorMaximoRespuesta.setEnabled(false);
		this.setEnabledPorPestana(false, 1);
		if (this.cmbTipoRespuesta.getSelectedItem() != null) {
			if (((TipoRespuesta)cmbTipoRespuesta.getSelectedItem()).getId().equals(TipoRespuesta.NUMERICA)) {
				this.txtValorMinimoRespuesta.setEnabled(true);
				this.txtValorMaximoRespuesta.setEnabled(true);
			}
			else if (((TipoRespuesta)cmbTipoRespuesta.getSelectedItem()).getId().equals(TipoRespuesta.SELECCION_SIMPLE) ||
					 ((TipoRespuesta)cmbTipoRespuesta.getSelectedItem()).getId().equals(TipoRespuesta.SELECCION_MULTIPLE)) {
				this.setEnabledPorPestana(true, 1);
			}
		}
	}
	
	private ActionListener cmbTipoRespuestaListener = new ActionListener() {
		public void actionPerformed(ActionEvent arg0) {
			configurarPorTipoDeRespuesta();
		}
	};
	
	private Column configurarPrimerTab() {
		Grid grid = new Grid();
		grid.setStyleName("Obelisco.GridPaneDialogo");
		grid.setSize(2);
		grid.setColumnWidth(0, new Extent(150, Extent.PX)); //PX denota pixeles						
		
		grid.add(new Label("Numero"));
		this.cmbNumero = new SelectField(100);
		grid.add(this.cmbNumero);
		
		grid.add(new Label("Enunciado"));
		this.txtEnunciado = new BindingTextField(250);
		this.txtEnunciado.setMaximumLength(250);
		grid.add(this.txtEnunciado);
		
		grid.add(new Label("Descripcion"));
		this.txtDescripcion = new BindingTextArea(250,50);
		this.txtDescripcion.setMaximumLength(250);
		grid.add(this.txtDescripcion);
		
		grid.add(new Label("Respuesta Obligatoria"));
		this.cmbRespuestaObligatoria = new SelectField(50);
		grid.add(this.cmbRespuestaObligatoria);
		
		grid.add(new Label("Tipo de Respuesta"));
		this.cmbTipoRespuesta = new SelectField(150);
		this.cmbTipoRespuesta.addActionListener(this.cmbTipoRespuestaListener);
		grid.add(this.cmbTipoRespuesta);
		
		grid.add(new Label("Valor Minimo"));
		this.txtValorMinimoRespuesta = new BindingNumericTextField(100);
		this.txtValorMinimoRespuesta.setMaximumLength(6);
		this.txtValorMinimoRespuesta.setEnabled(false);
		grid.add(this.txtValorMinimoRespuesta);
		
		grid.add(new Label("Valor Maximo"));
		this.txtValorMaximoRespuesta = new BindingNumericTextField(100);
		this.txtValorMaximoRespuesta.setMaximumLength(6);
		this.txtValorMaximoRespuesta.setEnabled(false);
		grid.add(this.txtValorMaximoRespuesta);
		
		Column columna = new Column();
		TabPaneLayoutData columnLayoutData = new TabPaneLayoutData();
		columnLayoutData.setTitle("Respuesta");
		columna.setLayoutData(columnLayoutData);
		columna.add(grid);
		return columna;
	}
	
	private void cargarCombosYListas() {
		this.cmbNumero.setItemDefectoActivado(false);
		List numeros = Numeros.getNumeros(1, this.encuesta.getPreguntas().size()+1);
		this.cmbNumero.inicializarDatos(numeros, "nombre", "id");
		this.cmbRespuestaObligatoria.setItemDefectoActivado(false);
		this.cmbRespuestaObligatoria.inicializarDatos(RespuestaCerrada.getRespuestasCerradas(), "nombre", "id");		
		this.cmbTipoRespuesta.inicializarDatos(TipoRespuesta.getTiposRespuesta(), "nombre", "id");
		this.lstOpcionesRespuesta.inicializarTabla(this.pregunta.getOpcionPreguntas());
		List parametros = new ArrayList();
		parametros.add(this.pregunta);
		this.lstOpcionesRespuesta.setListaParametros(parametros);
	}
	
	private void setBindings() {
		this.txtEnunciado.setBinding(this.pregunta, "enunciado");
		this.txtDescripcion.setBinding(this.pregunta, "descripcion");
		this.txtValorMinimoRespuesta.setBinding(this.pregunta, "valorMinimoRespuesta");
		this.txtValorMaximoRespuesta.setBinding(this.pregunta, "valorMaximoRespuesta");
	}
	
	private Component ventanaPadre = null;
	private void initComponents() {
		if(ventanaPadre == null) {
			ventanaPadre = this.getParent();
			while (!(ventanaPadre instanceof VentanaBase)) {
				ventanaPadre = ventanaPadre.getParent();
			}
		}
		((VentanaBase)ventanaPadre).getAreaTrabajo().removeAll();
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarPrimerTab());
		((VentanaBase)ventanaPadre).getAreaTrabajo().add(this.configurarSegundoTab());
		this.setEnabled(true);
	}
		
	public void onInicializar() {
		this.initComponents();
		this.setBindings();
		this.cargarCombosYListas();
		this.configurarPorTipoDeRespuesta();
	}

	public void onListaParametros(List listaParametros) {
		// TODO Auto-generated method stub
		this.encuesta = (Encuesta)listaParametros.get(0);
	}

	public void onModificar(Object objeto) {
		// TODO Auto-generated method stub
		this.cmbNumero.setSelectedItemPorId(this.pregunta.getNumero());
		this.cmbRespuestaObligatoria.setSelectedItemPorId(this.pregunta.getRespuestaObligatoria());
		this.cmbTipoRespuesta.setSelectedItemPorId(this.pregunta.getTipoRespuesta());
		this.configurarPorTipoDeRespuesta();
	}

	public void onObjetoEntidad(Object objeto) {
		// TODO Auto-generated method stub
		this.pregunta = (Pregunta)objeto;
	}

	public boolean onValidarDatos(Object objeto, TipoFuncion tipo, String nombre) {
		// TODO Auto-generated method stub		
		if ((this.cmbTipoRespuesta.getSelectedItem() != null) &&
			((((TipoRespuesta)this.cmbTipoRespuesta.getSelectedItem()).getId().equals(TipoRespuesta.SELECCION_SIMPLE)) ||
			 (((TipoRespuesta)this.cmbTipoRespuesta.getSelectedItem()).getId().equals(TipoRespuesta.SELECCION_MULTIPLE))) &&
			((this.lstOpcionesRespuesta.getItems() == null) ||
			 (this.lstOpcionesRespuesta.getItems().size() <= 1))){
				throw new ObeliscoException("DEBE SELECCIONAR AL MENOS DOS OPCIONES DE RESPUESTA.<br>");
		}
		return true;
	}

	
	// Getter y Setter
	public IServicioAdministracionDefinicionEncuesta getServicioAdministracionDefinicionEncuesta() {
		return servicioAdministracionDefinicionEncuesta;
	}

	public void setServicioAdministracionDefinicionEncuesta(
			IServicioAdministracionDefinicionEncuesta servicioAdministracionDefinicionEncuesta) {
		this.servicioAdministracionDefinicionEncuesta = servicioAdministracionDefinicionEncuesta;
	}

	public ListaBase getLstOpcionesRespuesta() {
		return lstOpcionesRespuesta;
	}

	public void setLstOpcionesRespuesta(ListaBase lstOpcionesRespuesta) {
		this.lstOpcionesRespuesta = lstOpcionesRespuesta;
	}

}
